// GET请求参数
type TGET_OPTIONS = {
    /** 请求地址 */
    url: string;
    /** 请求参数 */
    params?: TURL_PARAMS;
    /** 指定该值将会在数据加载完成后发布事件键，并以此作为事件键。 */
    eventKey?: string;
};

interface _CU_ {
    /**
     * GET请求
     * @param request 请求信息
     * @returns Promise
     */
    GET: <T>(request: string | TGET_OPTIONS) => Promise<T>;
}
{
    Object.defineProperty(_CU_.prototype, 'GET', {
        writable: false,
        configurable: false,
        enumerable: false,
        value: U.F.overloading('Utils-GET',
            {
                types: [Etype.string],
                fn: (request: string) => {
                    return U.GET({ url: request });
                }
            },
            {
                types: [Etype.obj],
                fn: async function (request: any) {
                    const requestUrl = U.splicingURL(request.url, request.params);
                    return await fetch(requestUrl)
                        .then(response => {
                            // 统一封装取数据方式
                            if (!response.ok) { throw new Error(response.statusText); }
                            return response.json();
                        })
                        .then(data => {
                            // 如果定义了事件键，则发布事件。
                            if (U.is(Etype.string, request.eventKey)) {
                                window.dispatchEvent(new CustomEvent(request.eventKey, {
                                    detail: {
                                        requestUrl: requestUrl,
                                        responseData: data,
                                    }
                                }));
                            }
                            return data;
                        })
                        .catch(err => {
                            // 统一封装错误处理方式
                            throw err;
                        });
                }
            },
        )
    });
}
